"""
    名称：
        英文名称：Module.Welcome
        中文名称：欢迎窗口模块

    定义：
        【类】WelcomeClass       欢迎窗口类
"""

# 导入相关模块
import tkinter                                  # GUI模块
import tkinter.font                             # 字体模块
import threading                                # 线程模块
import time                                     # 时间模块
from Module.Functions import Center_Window      # 自定义：窗口居中函数


class WelcomeClass(tkinter.Toplevel):
    """
        欢迎窗口生成类，负责接收用户输入的昵称

        继承自tkinter.Toplevel类

        方法：
            __init__：初始化
            __onWindow_closed：处理关闭窗口事件
            __check_run：检查运行状态和用户昵称
            __onEnter_click：检查用户昵称，合法后进入主窗体
            __onExit_click：退出系统
    """

    def __init__(self, master):
        """
            窗口初始化

            参数：
                master：隶属对象，当前为主窗口
        """

        """
        利用继承tkinter库的Toplevel类实现弹窗
        """

        # 调用父类初始化方法进行对象初始化
        tkinter.Toplevel.__init__(self, master=master)

        """
        定义类的属性变量
        """

        # 窗口运行状态（默认：True）
        self.__Dialog_Run_State = True
        # 昵称（默认为''，临时存储，最终存储在主窗体的Nickname变量中）
        self.__Nickname = ''
        # 存储隶属对象（主窗体）
        self.__APP = master

        """
        设置弹窗属性
        """

        # 取消边框和标题栏【调试时可暂时关闭】
        self.overrideredirect(1)
        # 设置窗体标题
        self.title("Welcome to Dis Gobang")
        # 窗体不允许变化大小
        self.resizable(False, False)
        # 调用自定义函数 屏幕居中 设置窗体高度、宽度以及位置
        Center_Window(self, 400, 200)

        """
        创建弹窗相应的组件
        """

        # 框架
        self.__mian_frame = tkinter.Frame(master=self, width=400, height=200)
        self.__mian_frame.pack()
        # 标题
        self.__title_font = tkinter.font.Font(
            family='微软雅黑', size=14, weight=tkinter.font.BOLD)
        self.__lab_title = tkinter.Label(
            self.__mian_frame, text="欢迎使用Dis Gobang!", font=self.__title_font)
        self.__lab_title.place(relx=0.5, y=10, anchor=tkinter.N)
        # 提示
        self.__lab_welcome = tkinter.Label(self.__mian_frame, text="请输入您的昵称：")
        self.__lab_welcome.place(x=40, y=70, anchor=tkinter.W)
        # 昵称文本框
        self.__text_nickname = tkinter.Entry(self.__mian_frame)
        self.__text_nickname.place(x=200, y=70, anchor=tkinter.W)
        # 进入按钮（绑定__onEnter_click方法）
        self.__bt_nickname_submit = tkinter.Button(
            self, text='进入', width=10, height=1, command=self.__onEnter_click)
        self.__bt_nickname_submit.place(
            x=200, y=120, anchor=tkinter.W)  # 以左上角（NW）为基准坐标设置X,Y
        # 退出按钮（绑定__onExit_click方法）
        self.__bt_close_selfs = tkinter.Button(
            self, text='退出', command=self.__onExit_click)
        self.__bt_close_selfs.place(
            x=380, y=180, anchor=tkinter.SE)  # 以右下角（SE）为基准坐标设置X,Y
        # 错误信息
        self.__lab_error_msg = tkinter.Label(self, text="", fg="red")
        self.__lab_error_msg.place(x=40, y=120, anchor=tkinter.W)

        """
        创建并启动检查昵称的线程，调用__check_run方法进行输入的昵称进行合法性检查
        同时方法会检查窗口是否要关闭
        """

        # 创建检查昵称的线程
        self.t = threading.Thread(target=self.__check_run)
        # 设置为守护线程
        self.t.setDaemon(True)
        # 线程启动
        self.t.start()

        """
        通过监听窗口关闭事件，处理关闭后的相关操作，绑定__onWindow_closed方法
        """

        # 监听关闭窗口事件
        self.protocol("WM_DELETE_WINDOW", self.__onWindow_closed)

    def __onWindow_closed(self):
        """
            关闭窗口事件处理方法
        """

        # 销毁主窗口并退出程序
        self.__APP.destroy()
        self.__APP.quit()

    def __check_run(self):
        """
            检查用户名合法性，同时监控是否要销毁弹窗
        """

        while True:
            # 判断用户名是否合法（当前判断用户名合法性逻辑比较简单，没有单独提取方法处理）
            if self.__Dialog_Run_State:
                # 获取文本框中输入的内容
                tmp_name = self.__text_nickname.get()
                if 3 > len(tmp_name) or len(tmp_name) > 20:
                    self.__lab_error_msg["text"] = "请输入3-20个字符的昵称"
                else:
                    self.__lab_error_msg["text"] = ""
            else:
                break
            # 延迟1秒判断一次
            time.sleep(1)
        # 当前窗口销毁
        self.destroy()

    def __onEnter_click(self):
        """
            检查昵称、关闭弹窗、进入主窗体
        """

        # 获取用户昵称
        self.__Nickname = self.__text_nickname.get()
        # 判断用户名是否合法（当前判断用户名合法性逻辑比较简单，没有单独提取方法处理）
        if 3 <= len(self.__Nickname) < 20:
            # 窗口运行状态 改为关闭，同时不再继续检查用户昵称
            self.__Dialog_Run_State = False
            # 当前弹窗隐藏
            self.withdraw()
            # 设置全局昵称
            self.__APP.Nickname = self.__Nickname
            # 显示当前用户昵称
            self.__APP.Assisted.Show_Nickname()
            # 原主窗体显示
            self.__APP.update()
            self.__APP.deiconify()

    def __onExit_click(self):
        """
            退出程序
        """

        # 销毁主窗口并退出程序
        self.__APP.destroy()
        self.__APP.quit()
